﻿#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

int main()
{


	std::vector<int> ms = { 3,0,9,2 };

	//对容器中的元素进行排序
	std::sort(ms.begin(), ms.end());
	//遍历输出排序后的元素
	for (int n : ms)
	{
		std::cout << n << ",";
	}
	std::cout << "\n";


	//std::partial_sort: 对部分区间排序，前 n 个元素为有序。
	std::partial_sort(ms.begin(), ms.begin() + 3, ms.end());

	//std::stable_sort: 稳定排序，保留相等元素的相对顺序。
	std::stable_sort(ms.begin(), ms.end());


	//搜索:如果找到，it 将指向匹配的元素；如果没有找到，it 将等于 container.end()。
	auto it = std::find(ms.begin(), ms.end(), 9);
	if (it != ms.end()) {
		std::cout << "Found: " << *it << std::endl;
	}
	else {
		std::cout << "Value not found." << std::endl;
	}

	//对有序区间进行查找
	bool found = std::binary_search(ms.begin(), ms.end(), 4);
	if (found) {
		std::cout << "Found: " << 4 << std::endl;
	}
	else {
		std::cout << "Value not found." << std::endl;
	}



	//查找第一个满足特定条件的元素。
	it = std::find_if(ms.begin(), ms.end(), [](int x) { return x > 3; });
	if (it != ms.end()) {
		std::cout << "Found: " << *it << std::endl;
	}
	else {
		std::cout << "Value not found." << std::endl;
	}



	//复制算法：将一个范围内的元素复制到另一个容器或数组
	std::vector<int> source = { 1, 2, 3, 4, 5 };
	int destination[5];
	std::copy(source.begin(), source.end(), destination);

	for (int i = 0; i < 5; ++i) {
		std::cout << destination[i] << " ";
	}
	std::cout << std::endl;



	//比较算法：比较两个容器或两个范围内的元素是否相等。
	std::vector<int> v1 = { 1, 2, 3, 4, 5 };
	std::vector<int> v2 = { 1, 2, 3, 9, 5 };

	bool are_equal = std::equal(v1.begin(), v1.end(), v2.begin());
	std::cout << (are_equal ? "Vectors are equal." : "Vectors are not equal.") << std::endl;



	//修改算法
	std::reverse(v1.begin(), v1.end()); //反转区间内的元素顺序
	std::fill(v1.begin(), v1.end(), 0); //将指定区间内的所有元素赋值为某个值。
	//std::replace: 将区间内的某个值替换为另一个值。
	std::replace(v1.begin(), v1.end(), 1, 99);  // 将所有 1 替换为 99
	//std::copy: 将区间内的元素复制到另一个区间。
	std::vector<int> v3(6);
	std::copy(v1.begin(), v1.end(), v3.begin());



	//排列算法
	//std::next_permutation: 生成字典序的下一个排列，如果没有下一个排列则返回 false。

	std::vector<int> vec = { 1, 2, 3 };
	do {
		for (int n : vec) std::cout << n << " ";
		std::cout << std::endl;
	} while (std::next_permutation(vec.begin(), vec.end()));

	//std::prev_permutation: 生成字典序的上一个排列。
	std::prev_permutation(vec.begin(), vec.end());




	//归并算法
	//std::merge: 将两个有序区间合并到一个有序区间。
	std::vector<int> vec1 = { 1, 3, 5 };
	std::vector<int> vec2 = { 2, 4, 6 };
	std::vector<int> result(6);
	std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result.begin());

	//std::inplace_merge: 在单个区间中合并两个有序子区间。
	std::vector<int> v = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
	// 注意：整个v目前是两部分有序的：
	// 第一部分 [v.begin(), v.begin()+5): {1, 3, 5, 7, 9}
	// 第二部分 [v.begin()+5, v.end()):  {2, 4, 6, 8, 10}

	// 使用 std::inplace_merge 将它们合并为一个有序序列
	std::inplace_merge(v.begin(), v.begin() + 5, v.end());

	for (int num : v) {
		std::cout << num << " ";
	}
	// 输出: 1 2 3 4 5 6 7 8 9 10




	//集合算法
	//std::set_union: 计算两个有序集合的并集。

	std::vector<int> result2(10);
	auto it2 = std::set_union(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result2.begin());
	result2.resize(it2 - result2.begin());

	//std::set_intersection: 计算两个有序集合的交集。
	result2.resize(10);
	auto it3 = std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result2.begin());
	result2.resize(it3 - result2.begin());

	//std::set_difference: 计算集合的差集。
	result2.resize(10);
	auto it4 = std::set_difference(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), result2.begin());
	result2.resize(it4 - result2.begin());


	//其他有用算法
	//std::accumulate（需要 <numeric> 库）：计算范围内元素的累计和。
	int sum = std::accumulate(vec.begin(), vec.end(), 0);

	//std::for_each: 对区间内的每个元素执行操作。
	std::for_each(vec.begin(), vec.end(), [](int& x) { x += 1; });

	//std::min_element 和 std::max_element: 查找区间内的最小值和最大值。
	auto min_it = std::min_element(vec.begin(), vec.end());
	auto max_it = std::max_element(vec.begin(), vec.end());
}
